#ifndef SERVER_H
#define SERVER_H

#include <QObject>
#include <QDebug>
#include <QHttpServer>
#include <QProtobufSerializer>
#include <QProtobufSerializer>
#include <QWebSocketServer>
#include <QFileInfo>
#include <QFile>
#include <QPixmap>
#include <QIcon>
#include <QDateTime>


//////////////////////////////////////////////////////////////
/// 工具函数，供多个模块使用
/////////////////////////////////////////////////////////////
//函数定义如果写在 .h中必须加static 或者 inline(inline被编译器默认是static inline), 文件是分离编译，不加static在链接时候会报重定义错误

//获取文件名
static inline QString getFileName(const QString& path)
{
    QFileInfo fileInfo(path);
    return fileInfo.fileName();
}
//封装"宏" 作为打印日志的方法
#define TAG  QString("[%1:%2]").arg(getFileName(__FILE__),QString::number(__LINE__))

//不带双引号
#define LOG() qDebug().noquote() << TAG
//#define TAG "[" << __LINE__ << "]"


//格式化时间
static inline QString formatTime(int64_t timestamp)
{
    //先把时间戳转换为QDateTime 对象
    QDateTime dateTime = QDateTime::fromSecsSinceEpoch(timestamp);
    //把QDateTime对象转换为 "格式化时间"
    return dateTime.toString("MM-dd HH:mm:ss");
}

//通过函数得到 秒级时间
static inline int64_t getTime()
{
    return QDateTime::currentSecsSinceEpoch();
}

//根据QByteArraay, 转换成QIcon
static inline QIcon  makeIcon(const QByteArray& byteArray)
{
    QPixmap pixmap;
    pixmap.loadFromData(byteArray);
    QIcon icon (pixmap);
    return icon;
}

//读写文件
//从指定文件中，读取所有二进制内容,得到一个QByteArray
static inline QByteArray loadFileToByteArray(const QString& path)
{
    QFile file(path);
    bool ok = file.open(QFile::ReadOnly);
    if (!ok)
    {
        LOG() << "文件打开失败"  << "loadFileToByteArray";
        return QByteArray();
    }
    QByteArray content = file.readAll();
    file.close();
    return content;
}

//把QByteArray 中的内容,写入到某个指定文件里
static inline void writeByteArrayToFile(const QString& path,  const QByteArray& content)
{
    QFile file(path);
    bool ok = file.open(QFile::WriteOnly);
    if (!ok)
    {
        qDebug() << "文件打开失败";
        return;
    }
    file.write(content);
    file.flush();
    file.close();
}

///////////////////////////
/// HTTP服务器
///////////////////////////

class HttpServer: public QObject{
    Q_OBJECT

private:
    static HttpServer* instance;
    HttpServer();
    QHttpServer httpServer;
    QProtobufSerializer serializer;

public:
    static HttpServer* getInstance();

    //通过这个函数,针对Http Server 进行初始化(绑定端口, 配置路由 ...)
    bool init();

    // 获取个人用户信息
    QHttpServerResponse getUserInfo(const QHttpServerRequest& req);
    //获取好友列表
    QHttpServerResponse getFriendList(const QHttpServerRequest& req);
    //获取会话列表
    QHttpServerResponse getChatSessionList(const QHttpServerRequest& req);
    //获取好友申请列表
    QHttpServerResponse getApplyList(const QHttpServerRequest& req);
    //获取指定会话的最近消息列表
    QHttpServerResponse  getRecent(const QHttpServerRequest& req);
    //处理发送消息
    QHttpServerResponse newMessage(const QHttpServerRequest& req);
    //修改用户昵称
    QHttpServerResponse setNickname(const QHttpServerRequest& req);
    //修改用户签名
    QHttpServerResponse setDesc(const QHttpServerRequest& req);
    //获取短信验证码
    QHttpServerResponse getPhoneVerifyCode(const QHttpServerRequest& req);
    //修改手机号
    QHttpServerResponse setPhone(const QHttpServerRequest& req);
    //修改头像
    QHttpServerResponse setAvatar(const QHttpServerRequest& req);
    //删除好友
    QHttpServerResponse removeFriend(const QHttpServerRequest& req);
    //添加好友申请
    QHttpServerResponse addFriendApply(const QHttpServerRequest& req);
    //添加好友申请的处理
    QHttpServerResponse addFriendProcess(const QHttpServerRequest& req);
    //创建会话
    QHttpServerResponse createChatSession(const QHttpServerRequest& req);
    //获取会话成员列表
    QHttpServerResponse getChatSessionMember(const QHttpServerRequest& req);
    //搜索好友
    QHttpServerResponse searchFriend(const QHttpServerRequest& req);
    //搜素历史会话
    QHttpServerResponse searchHistory(const QHttpServerRequest& req);
    //按时间搜索历史消息
    QHttpServerResponse getHistory(const QHttpServerRequest& req);
    //基于用户名密码登录
    QHttpServerResponse usernameLogin(const QHttpServerRequest& req);
    //基于用户名密码注册
    QHttpServerResponse usernameRegister(const QHttpServerRequest& req);
    //手机号登录
    QHttpServerResponse phoneLogin(const QHttpServerRequest& req);
    //手机号注册
    QHttpServerResponse phoneRegister(const QHttpServerRequest& req);
    //获取单个文件
    QHttpServerResponse getSingleFile(const QHttpServerRequest& req);
    //语音转文字
    QHttpServerResponse recognition(const QHttpServerRequest& req);






};


///////////////////////////
/// webSocket服务器
///////////////////////////

class WebsocketServer: public QObject{
    Q_OBJECT

private:
    static WebsocketServer* instance;
    WebsocketServer();
    QWebSocketServer websocketServer;
    QProtobufSerializer serializer;
    int messageIndex  = 0;
public:
    static WebsocketServer* getInstance();

    //针对websocket 服务器进行初始化操作
    bool init();


signals:
    void sendTextResp();
    void sendFriendRemove();
    void sendAddFriendApply();
    void sendAddFriendProcess(bool argee);
    void sendCreateChatSession();
    void sendImageResp();
    void sendFileResp();
    void sendSpeechResp();
};

#endif // SERVER_H
